/*
 *  NFCSigning - Open source library for signing/validation of NDEF messages
 *  Copyright (C) 2009-2010 The NFCSigning Team
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *
 */
package org.nfcsigning.certificate;

import org.nfcsigning.algorithm.DSAVerifier;
import org.nfcsigning.algorithm.ECDSAVerifier;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.asn1.x509.X509CertificateStructure;

/**
 *
 * @author Markus Kilås
 */
public class X509Certificate implements Certificate {
    
    private X509CertificateStructure structure;

    public X509Certificate(byte[] bytes) throws IOException {
        this(new ByteArrayInputStream(bytes));
    }
    
    public X509Certificate(InputStream in) throws IOException {
        ASN1InputStream aIn = new ASN1InputStream(in);
        DERObject o = aIn.readObject();
        if(!(o instanceof ASN1Sequence)) {
            throw new IOException("Unexpected content: " + o);
        }
        ASN1Sequence encodedSeq = (ASN1Sequence) o;
        structure = X509CertificateStructure.getInstance(encodedSeq);
    }

    public X509CertificateStructure getStructure() {
        return structure;
    }

    public byte[] getBytes() throws IOException {
        return structure.getEncoded();
    }

    public SubjectPublicKeyInfo getSubjectPublicKeyInfo() {
        return structure.getSubjectPublicKeyInfo();
    }
    
    public static String getAlgorithmName(AlgorithmIdentifier algoritmIdentifier) {
        
        DERObjectIdentifier algorithmObjectId = algoritmIdentifier.getObjectId();
        
        if(PKCSObjectIdentifiers.rsaEncryption.equals(algorithmObjectId)) {
            return "RSA";
        } else if (PKCSObjectIdentifiers.sha1WithRSAEncryption.equals(algorithmObjectId)) {
            return "sha1WithRSA";
        } else if (ECDSAVerifier.ECDSA.equals(algorithmObjectId)) {
            return "ECDSA";
        } else if (ECDSAVerifier.SHA1withECDSA.equals(algorithmObjectId)) {
            return "sha1WithECDSA";
        } else if(DSAVerifier.id_dsa_with_sha1.equals(algorithmObjectId)) {
            return "sha1WithDSA";
        } else if(DSAVerifier.id_dsa.equals(algorithmObjectId)) {
            return "DSA";
        }
        
        return algorithmObjectId.toString();
    }
}
